package com.example.launibleplugin.model

import com.google.gson.annotations.SerializedName

/**
 * 数据类型枚举
 * Function: 定义呼吸家设备支持的数据类型
 * Note: 根据呼吸家设备协议定义的数据类型
 */
enum class DataType {
    RESPIRATORY_RATE,    // 呼吸频率
    TIDAL_VOLUME,       // 潮气量
    MINUTE_VOLUME,      // 分钟通气量
    OXYGEN_SATURATION,  // 血氧饱和度
    HEART_RATE,         // 心率
    TEMPERATURE,        // 体温
    PRESSURE,           // 气道压力
    FLOW_RATE,          // 流速
    UNKNOWN             // 未知类型
}

/**
 * 数据点模型
 * Function: 表示单个测量数据点
 * Parameter: 指标名称、数值、单位、时间戳
 * Note: 用于存储具体的测量值
 */
data class DataPoint(
    @SerializedName("point_id")
    val pointId: String,
    
    @SerializedName("metric_name")
    val metricName: String,
    
    @SerializedName("value")
    val value: Float,
    
    @SerializedName("unit")
    val unit: String,
    
    @SerializedName("timestamp")
    val timestamp: Long = System.currentTimeMillis(),
    
    @SerializedName("quality")
    val quality: Int = 100 // 数据质量评分 0-100
) {
    /**
     * Function: 获取格式化的数值字符串
     * Return: String - 带单位的数值字符串
     * Note: 格式化显示数值和单位
     */
    fun getFormattedValue(): String {
        return String.format("%.2f %s", value, unit)
    }
    
    /**
     * Function: 判断数据质量是否良好
     * Return: Boolean - 数据质量是否达标
     * Note: 质量评分大于等于80认为是良好数据
     */
    fun isGoodQuality(): Boolean {
        return quality >= 80
    }
}

/**
 * 数据记录模型
 * Function: 表示从蓝牙设备接收的完整数据记录
 * Parameter: 记录ID、连接ID、数据类型、原始数据、解析数据等
 * Note: 用于数据存储和传输
 */
data class DataRecord(
    @SerializedName("record_id")
    val recordId: String,
    
    @SerializedName("connection_id")
    val connectionId: String,
    
    @SerializedName("data_type")
    val dataType: DataType,
    
    @SerializedName("timestamp")
    val timestamp: Long = System.currentTimeMillis(),
    
    @SerializedName("raw_data")
    val rawData: ByteArray,
    
    @SerializedName("parsed_data")
    val parsedData: Map<String, Any>? = null,
    
    @SerializedName("data_points")
    val dataPoints: List<DataPoint> = emptyList(),
    
    @SerializedName("device_id")
    val deviceId: String,
    
    @SerializedName("sequence_number")
    val sequenceNumber: Long = 0,
    
    @SerializedName("checksum")
    val checksum: String? = null
) {
    /**
     * Function: 获取原始数据的十六进制字符串
     * Return: String - 十六进制格式的原始数据
     * Note: 用于调试和日志记录
     */
    fun getRawDataHex(): String {
        return rawData.joinToString(" ") { "%02X".format(it) }
    }
    
    /**
     * Function: 获取数据类型描述
     * Return: String - 数据类型的中文描述
     * Note: 将枚举类型转换为用户友好的描述
     */
    fun getDataTypeDescription(): String {
        return when (dataType) {
            DataType.RESPIRATORY_RATE -> "呼吸频率"
            DataType.TIDAL_VOLUME -> "潮气量"
            DataType.MINUTE_VOLUME -> "分钟通气量"
            DataType.OXYGEN_SATURATION -> "血氧饱和度"
            DataType.HEART_RATE -> "心率"
            DataType.TEMPERATURE -> "体温"
            DataType.PRESSURE -> "气道压力"
            DataType.FLOW_RATE -> "流速"
            DataType.UNKNOWN -> "未知类型"
        }
    }
    
    /**
     * Function: 验证数据完整性
     * Return: Boolean - 数据是否完整有效
     * Note: 检查必要字段和数据校验和
     */
    fun isValid(): Boolean {
        return recordId.isNotBlank() && 
               connectionId.isNotBlank() && 
               deviceId.isNotBlank() && 
               rawData.isNotEmpty()
    }
    
    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false
        
        other as DataRecord
        
        if (recordId != other.recordId) return false
        if (connectionId != other.connectionId) return false
        if (dataType != other.dataType) return false
        if (timestamp != other.timestamp) return false
        if (!rawData.contentEquals(other.rawData)) return false
        
        return true
    }
    
    override fun hashCode(): Int {
        var result = recordId.hashCode()
        result = 31 * result + connectionId.hashCode()
        result = 31 * result + dataType.hashCode()
        result = 31 * result + timestamp.hashCode()
        result = 31 * result + rawData.contentHashCode()
        return result
    }
}